// shift + alt + F 全局格式化

// 数组的创建
let arr = new Array(1, 2, 3, 4, 5, 6);
let arr1 = [7, 8, 9, 10, 11];

let str = '12311111111111111111111111';
str.indexOf('23');

// 修改指定索引的元素
arr[0] = 20
arr[5] = 60

// 根据指定索引，查找对应的元素
arr.at(2);
arr[3]; // 常用

str.charAt(1);
str[1] // 常用

// 向数组末尾追加元素
arr.push(70);

// 向数组头部追加元素
arr.unshift(100);

// 从末尾弹出一个元素并返回
arr.pop();

// 从头部弹出一个元素并返回
arr.shift();

// 连接两个数组
arr.concat(5, 6, 7);
arr.concat(arr1); // 可以连接其他数组

// 循环数组
arr.forEach((item, index, arrself) => {

});

// 将所有元素合并成一个字符串
arr.join('#')

// 数组切片
arr.slice(1, 2);

// 数组删除并替换
// 1 起始索引
// 3 是从起始索引往后删除的个数
// 1,2,3 在起始索引的位置，插入指定元素
arr.splice(1, 3, 1, 2, 3, 4, 5, 6);

// 数组元素倒置
arr.reverse()

// 拍扁：降维，且只降最顶层维度
arr1.flat();

let w2 = [
    [1, 2, 3],
    [4, 5, 6]
];
// 2维数组：1维数组的每一个元素，都一个1维数组

let w3 = [
    [
        [1, 2, 3],
        [4, 5, 6]
    ],
    [
        [7, 8, 9],
        [10, 11, 12]
    ]
]
// 3维数组：1维数组的每一个元素，都一个2维数组

// 排序
// UTF Unicode Transformation Format 统一编码转换格式
arr1.sort(); // 什么参数都不传，会将元素按照 utf 编码，从低到高 进行排序
const arr2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
arr2.sort((a, b) => {
    console.log('下一个元素', a);
    console.log('本元素', b);
    let c = b - a;
    return c
});

const arr3 = [
    {id: 1},
    {id: 5},
    {id: 4},
    {id: 3},
    {id: 2},
]

arr3.sort((a, b) => {
    let x = b.id - a.id;
    return x
});

// 搜索某一个元素的索引
arr2.indexOf(9);
arr2.lastIndexOf(4);

// 映射循环
arr2.map((item, index, self) => {
    return item + 5;
});

// 拍扁映射循环：先升后降，维度不变
arr2.flatMap((item, index, self) => {
    return [item + 4, item + 5, item + 6] // 升维
});

// 过滤
arr2.filter((item, index, self) => {
    // return index > 4;
    return item > 4;
});

// 从头部开始查找元素
arr2.find((item, index, self) => {
    return item === 2; // boolean
});

// 从末尾开始查找元素
arr2.findLast((item, index, self) => {
    return item === 7;
});

// 从头部开始查找元素的索引
arr2.findIndex((item, index, self) => {
    return item === 2;
});

// 从末部开始查找元素的索引
arr2.findLastIndex((item, index, self) => {
    return item === 8;
});

// 整合元素（从前往后整合）
arr2.reduce(
    (x, item) => {
        // x 一开始等于reduce第二个参数
        // x 之后，等于第一个参数函数的返回值
        return x + item;
    },
    0
); // 会把最后一次结果返回回去

arr2.reduceRight((x, item) => {
    return x + item;
}, 0);

// fill
const arr5 = new Array(50);
// [,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,]
arr.fill(0); // 用指定元素填充整个数组，如果有元素会被直接覆盖
// [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]